import axios from 'axios'

import router from '@/router';

//axios 的二次封装
// axios.defaults.baseURL=''
const instance = axios.create({
    //fasemock 的根地址 https://www.fastmock.site/mock/
    //将baseURL 的地址 修改为 代理地址 /api
    // baseURL: 'https://www.fastmock.site/mock/e2fdb423bfb091815952302d441c69bb/task',//管理接口根地址
    baseURL: '/api',
    timeout: 2000, // 超时时间

})

//第二步 ：请求拦截
/* 
axios拦截器的主要作用：对所有的http请求的， 发送请求或响应数据  进行拦截处理

==> 发送请求 具有两种情况
！=》发送请求成功之前进行拦截请求
！=》发送请求错误进行拦截处理
==》响应拦截 具有

*/

//请求拦截
// 添加请求拦截器
instance.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    let token = window.sessionStorage.getItem('token');

    if (token) {
        //添加token
        config.headers['token'] = token;

    } else {

        //跳转登录
        router.replace('/login')

    }


    return config;
}, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
});

// 添加响应拦截器
instance.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    //除了http请求状态成功之外，还要判断业务状态是否成功
    const state = response.data.code
    switch (code) {
        case 401: //未登录
            //跳转登录页
            router.replace('/login')
            break;
        case 402: //
            alert('响应失败')
            break;
        default:
            break;

    }

    return response;
}, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    if (error.message.includes('timeout')) {
        alert('请求超时，请刷新重试')
    } else if (error.message.includes('Network Error')) {
        alert('网络异常，请检查网络后重试')
    } else if (error.message.includes('404')) {
        alert('请求地址不存在')
    } else {
        alert('请求失败，请刷新重试')
    }

    return Promise.reject(error);
});


//第三步 封装请求方法 post get
/* const request = (method, url, params, headers) => {
    const data = method === 'get' ? { params } : { data: params }
    return new Promise((resolve) => {
        instance({

            headers,
            method,
            url,
            ...data
        }).then((res) => {
            resolve(res)
        })
    })
}

 */
/* 

function post(url = '', data = {}, headers = {}) {
    return instance.post(url, data, {
        headers
    })
}
function get(url = '', params = {}, headers = {}) {
    return instance.get(url, {
        params,
        headers
    })
}
 */
//拥有get，post 方法 
const request = (method, url = '', params = {}, headers = {}) => {
    const data = method === 'get' ? { params } : { data: params }
    return new Promise((resolve) => {
        instance({
            headers,
            method,
            url,
            ...data
        }).then((res) => {
            resolve(res)
        })
    })
}


//简化api.js 模块，将发送请求封装到get 或post 中




function instanceRequest(method = 'get', url = '', userdata = {}, headers = {}) {

    let data = {};
    let params = {}
    switch (method.toLowerCase()) {
        case 'get':
        case 'delete':
        case 'options':
            params = userdata;
            break;
        case 'post':
        case 'put':
            data = userdata
            break;
        default:
            break;
    }
    return instance.request({
        method,
        url,
        data,
        params,
        headers

    })


}
//统一暴露
/* export {
    get,
    post,
    instance,
    instanceRequest,


} */

export {
    request,
    instanceRequest,
    instance
}




//默认暴露

// export default {
//     instance,
//     instanceRequest,
//     post,
//     get
// }



// const http = {
//     instanceRequest,
//     post,
//     get,
//     instance

// }

